package algorithm;

import java.util.*;

/**
 * 从一副54张扑克牌中随机抽5张牌，
 * 红桃标识为“B”,
 * 黑桃标识为“C”，
 * 方块标识为“D”，
 * 梅花标识为“E”，
 * 大王标识为“F”,
 * 小王标识为“G”,
 * 判断是不是一个顺子，即这5张牌是不是连续的，
 * A为1，J为11，Q为12，K为13，
 * 大小王可以看成任意牌。
 * 写出主要代码（可写伪代码）
 */
public class PK {
    public static void main(String[] args) {
        //todo 生成54张扑克牌
        HashMap<String,Integer> PK = createPK();
        System.out.println("生成54张扑克牌:"+PK);
        //todo 随机五张
        Random rand = new Random();
        int[] table = new int[5];
        for(int i=0; i<5; i++) {
            table[i] = rand.nextInt(53) + 1;
        }
        System.out.println("随机五张:"+Arrays.toString(table));
        int[] newTable = rsort(table);
        System.out.println("五张排序:"+Arrays.toString(newTable));
        //todo 判断是否连续
        boolean isContinuous = true;
        boolean isBig = true;
        Integer numBig = 0;
        int sub = 0;
        if(Arrays.asList(newTable).contains(53)){
            numBig++;
        }
        if(Arrays.binarySearch(newTable,54) > 0){
            numBig++;
        }
        for (int i = 1;i<newTable.length-1;i++){
            if( newTable[i] > 52 ) {//特殊身份
                continue;
            }
            sub = newTable[i]-newTable[i-1];
            if(sub > 3){
                isContinuous = false;
                break;
            } else {
                if(sub > 1) {
                    if (numBig > 0) {
                        numBig--;
                    } else {
                        isContinuous = false;
                        break;
                    }
                }
            }
        }
        System.out.println("是否连续:"+isContinuous);
    }

    //生成扑克
    public static HashMap<String,Integer> createPK() {
        HashMap<String,Integer> PK = new HashMap<>();
        HashMap<String,Integer> baseMap = new HashMap<>();
        baseMap.put("B",0);
        baseMap.put("C",0);
        baseMap.put("D",0);
        baseMap.put("E",0);
        baseMap.put("F",1);//特殊身份
        baseMap.put("G",1);//特殊身份

        Iterator iter = baseMap.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry entry = (Map.Entry) iter.next();
            String key = entry.getKey().toString();
            int max = 0;
            if(Integer.parseInt(entry.getValue().toString()) == 0){
                for(int i = 1;i<14;i++){
                    max = PK.size()+1;
                    PK.put(key+i,max);
                }
            } else {
                max = PK.size()+1;
                PK.put(key,max);
            }
        }
        return PK;
    }

    //重排
    public static int[] rsort(int[] table){
        quickSort(table,0,table.length-1);
        return table;
    }

    public static void quickSort(int[] table, int low, int high) {
        if (low < high){
            int i=low,j=high;
            int vot = table[i];//第一个值作为基准值
            while (i!=j){
                while (i<j && vot<=table[j]){ //从后向前寻找最小值
                    j--;
                }
                if(i<j){
                    table[i] = table[j]; //较小元素想前移
                    i++;
                }
                while(i<j && table[i]<vot){//从前向后寻找最大值
                    i++;
                }
                if(i<j){
                    table[j] = table[i]; //较大元素向后移
                    j--;
                }
            }
            table[i] = vot;
            quickSort(table,low,j-1); //前端再排
            quickSort(table,i+1,high);//后端再排
        }
    }
}
